home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1994 November: Tool Chest / Dev.CD Nov 94.toast / New System Software Extensions / OpenDoc A6 / OpenDoc Parts Framework / OPF / Found / FWDebug / Sources / FWSymFil.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-21  |  9.2 KB  |  365 lines  |  [TEXT/MPS ]

  1. #if defined(FW_DEBUG) && defined(FW_BUILD_WIN)
  2. //========================================================================================
  3. //
  4. //    File:                FWSymFil.cpp
  5. //    Release Version:    $ 1.0d1 $
  6. //
  7. //    Creation Date:        3/28/94
  8. //
  9. //    Copyright:    © 1994 by Apple Computer, Inc., all rights reserved.
  10. //
  11. //========================================================================================
  12.  
  13. #include <Windows.h>
  14. #include <ToolHelp.h>
  15.  
  16. #ifndef FWSYMFIL_H
  17. #include "FWSymFil.h"
  18. #endif
  19.  
  20. #ifdef __ZTC__
  21. #include <HugePtr.h>
  22. #endif
  23.  
  24. #ifndef FWPRISTR_H
  25. #include "FWPriStr.h"
  26. #endif
  27.  
  28. #ifndef FWPRIMEM_H
  29. #include "FWPriMem.h"
  30. #endif
  31.  
  32. #ifndef FWMATH_H
  33. #include "FWMath.h"
  34. #endif
  35.  
  36.  
  37. //========================================================================================
  38. // Local utility functions
  39. //========================================================================================
  40.  
  41. // Private data structures: correspond to Windows format .SYM files
  42.  
  43. struct MAPDEF
  44. {
  45.     WORD ppNextMap;
  46.     BYTE bFlags;
  47.     BYTE bReserved1;
  48.     WORD pSegEntry;
  49.     WORD cConsts;
  50.     WORD pConstDef;
  51.     WORD cSegs;
  52.     WORD ppSegDef;
  53.     BYTE cbMaxSym;
  54.     BYTE cbModName;
  55.     char achModName[1];
  56. };
  57.  
  58. struct SEGDEF
  59. {
  60.     WORD ppNextSeg;
  61.     WORD cSymbols;
  62.     WORD pSymDef;
  63.     WORD wSeg;          // Segment paragraph
  64.     WORD wReserved2;
  65.     WORD wReserved3;
  66.     WORD wReserved4;
  67.     BYTE bFlags;
  68.     BYTE bReserved1;
  69.     WORD ppLineDef;
  70.     BYTE bReserved2;
  71.     BYTE bReserved3;
  72.     BYTE cbSegName;
  73.     char achSegName[1];
  74. };
  75.  
  76. struct SYMDEF
  77. {
  78.     WORD wSymVal;
  79.     BYTE cbSymName;
  80.     char achSymName[1];
  81. };
  82.  
  83. #define STACK_PROLOGUE_THRESHOLD 20
  84.  
  85.  
  86. //----------------------------------------------------------------------------------------
  87. // SymFindSegment
  88. //----------------------------------------------------------------------------------------
  89.  
  90. static SEGDEF* SymFindSegment(void* pData,
  91.                               WORD wSeg)
  92. {
  93. #ifdef FW_BUILD_WIN16
  94.  
  95.     MAPDEF * pMapDef = (MAPDEF *)pData;
  96.     SEGDEF * pSegDef = (SEGDEF *)((LPSTR)pData + (pMapDef->ppSegDef * 16));
  97.     WORD cSegs = pMapDef->cSegs;
  98.  
  99.     while (cSegs-- > 0)
  100.     {
  101.         if (pSegDef->cbSegName > 50)
  102.             return NULL;
  103.  
  104.         if (pSegDef->wSeg == wSeg)
  105.             return pSegDef;
  106. #ifdef __ZTC__
  107.         pSegDef = hugeptr_add((char*)pData, ((long)pSegDef->ppNextSeg) * 16L);
  108. #else
  109.         pSegDef = (SEGDEF *) ((char huge*)pData + ((DWORD)pSegDef->ppNextSeg * 16));
  110. #endif
  111.  
  112.     }
  113. #endif
  114.     return NULL;
  115. }
  116.  
  117.  
  118. //----------------------------------------------------------------------------------------
  119. // SymFindSymbol
  120. //----------------------------------------------------------------------------------------
  121.  
  122. static SYMDEF* SymFindSymbol(SEGDEF* pSegDef,
  123.                              WORD fOffset)
  124. {
  125. #ifdef FW_BUILD_WIN16
  126.     WORD * aSymPtr = (WORD *) ((BYTE *)pSegDef + pSegDef->pSymDef);
  127.     SYMDEF * pSymDef;
  128.     WORD wSymVal;
  129.     WORD i;
  130.  
  131.     for (i = 0; i < pSegDef->cSymbols; i++)
  132.     {
  133.         pSymDef = (SYMDEF *)((BYTE *)pSegDef + aSymPtr[i]);
  134.  
  135.         wSymVal = pSymDef->wSymVal;
  136.  
  137.         if (wSymVal > fOffset)
  138.             return NULL;
  139.         else if (wSymVal + STACK_PROLOGUE_THRESHOLD > fOffset)
  140.             return pSymDef;
  141.     }
  142. #endif
  143.     return NULL;
  144. }
  145.  
  146.  
  147. //----------------------------------------------------------------------------------------
  148. // SymFindAddress
  149. //----------------------------------------------------------------------------------------
  150.  
  151. static FW_Boolean SymFindAddress(void* pSymData,
  152.                                  WORD wSeg,
  153.                                  WORD fOffset,
  154.                                  BYTE cbMaxLen,
  155.                                  char* pzName)
  156. {
  157. #ifdef FW_BUILD_WIN16
  158.     SEGDEF * pSegDef = SymFindSegment(pSymData, wSeg);
  159.     SYMDEF * pSymDef = NULL;
  160.     WORD cbCopy;
  161.  
  162.     if (pSegDef != NULL)
  163.         pSymDef = SymFindSymbol(pSegDef, fOffset);
  164.  
  165.     if (pSymDef != NULL)
  166.     {
  167.         cbCopy = FW_Minimum(cbMaxLen - 1, pSymDef->cbSymName);
  168.         FW_PrimitiveCopyMemory(pzName, pSymDef->achSymName, cbCopy);
  169.         pzName[cbCopy] = 0;
  170.     }
  171.  
  172.     return pSymDef != NULL;
  173. #else
  174.     return FALSE;
  175. #endif
  176. }
  177.  
  178.  
  179. //========================================================================================
  180. // Class FW_CPrivWinSymFile
  181. //========================================================================================
  182.  
  183. //----------------------------------------------------------------------------------------
  184. // FW_CPrivWinSymFile::FW_CPrivWinSymFile
  185. //----------------------------------------------------------------------------------------
  186.  
  187. FW_CPrivWinSymFile::FW_CPrivWinSymFile(const char* pzFileName) :
  188.     fSymData(NULL)
  189. {
  190. #ifdef FW_BUILD_WIN16
  191.     HFILE hFile = ::_lopen(pzFileName, READ);
  192.     if (hFile != HFILE_ERROR)
  193.     {
  194.         long cbFileSize = ::_llseek(hFile, 0l, SEEK_END);
  195.         ::_llseek(hFile, 0l, SEEK_SET);
  196.  
  197.         fSymData = new char[cbFileSize];
  198.         if (fSymData != NULL)
  199.             ::_hread(hFile, fSymData, cbFileSize);
  200.  
  201.         ::_lclose(hFile);
  202.     }
  203. #endif
  204. }
  205.  
  206. //----------------------------------------------------------------------------------------
  207. // FW_CPrivWinSymFile::~FW_CPrivWinSymFile
  208. //----------------------------------------------------------------------------------------
  209.  
  210. FW_CPrivWinSymFile::~FW_CPrivWinSymFile(void)
  211. {
  212. #ifdef FW_BUILD_WIN16
  213.     delete[] fSymData;
  214. #endif
  215. }
  216.  
  217. //----------------------------------------------------------------------------------------
  218. // FW_CPrivWinSymFile::FindSymbol
  219. //----------------------------------------------------------------------------------------
  220.  
  221. FW_Boolean FW_CPrivWinSymFile::FindSymbol(unsigned short wSeg,
  222.                                          unsigned short fOffset,
  223.                                          unsigned short cbMaxLen,
  224.                                          char* pzName)
  225. {
  226. #ifdef FW_BUILD_WIN16
  227.  
  228.     if (fSymData != NULL)
  229.         return SymFindAddress(fSymData, wSeg, fOffset, cbMaxLen, pzName);
  230. #endif
  231.  
  232.     return NULL;
  233. }
  234.  
  235.  
  236. //========================================================================================
  237. // CLASS FW_CPrivWinDebugModuleList
  238. //========================================================================================
  239.  
  240. FW_CPrivWinDebugModuleList::sOneModule FW_CPrivWinDebugModuleList::fModules[FW_CPrivWinDebugModuleList::kMaxModules];
  241. unsigned short FW_CPrivWinDebugModuleList::fNumberOfModules = 0;
  242.  
  243. //----------------------------------------------------------------------------------------
  244. // FW_CPrivWinDebugModuleList::Initialize
  245. //----------------------------------------------------------------------------------------
  246.  
  247. void FW_CPrivWinDebugModuleList::Initialize(void)
  248. {
  249.     fNumberOfModules = 0;
  250. }
  251.  
  252. //----------------------------------------------------------------------------------------
  253. // FW_CPrivWinDebugModuleList::Terminate
  254. //----------------------------------------------------------------------------------------
  255.  
  256. void FW_CPrivWinDebugModuleList::Terminate(void)
  257. {
  258. #ifdef FW_BUILD_WIN16
  259.  
  260.     for (unsigned short i = 0; i < fNumberOfModules; i++)
  261.     {
  262.         delete fModules[i].fSymFile;
  263.         
  264.         fModules[i].fSymFile = NULL;
  265.         fModules[i].fModule = 0;
  266.     }
  267.     
  268.     fNumberOfModules = 0;
  269. #endif
  270. }
  271.  
  272. //----------------------------------------------------------------------------------------
  273. // FW_CPrivWinDebugModuleList::FindSymbol
  274. //----------------------------------------------------------------------------------------
  275.  
  276. FW_Boolean FW_CPrivWinDebugModuleList::FindSymbol(HANDLE fModule,
  277.                                                  unsigned short wSeg,
  278.                                                  unsigned short fOffset,
  279.                                                  unsigned short cbMaxLen,
  280.                                                  char* pzName)
  281. {
  282. #ifdef FW_BUILD_WIN16
  283.  
  284.     unsigned short i = FindModule(fModule);
  285.     if (i != kModuleNotFound)
  286.         return fModules[i].fSymFile->FindSymbol(wSeg, fOffset, cbMaxLen, pzName);
  287.  
  288. #endif
  289.     return FALSE;
  290. }
  291.  
  292.  
  293. //----------------------------------------------------------------------------------------
  294. // FW_CPrivWinDebugModuleList::GetModuleName
  295. //----------------------------------------------------------------------------------------
  296.  
  297. FW_Boolean FW_CPrivWinDebugModuleList::GetModuleName(HANDLE fModule,
  298.                                      char* pzName)
  299. {
  300. #ifdef FW_BUILD_WIN16
  301.     unsigned short i = FindModule(fModule);
  302.     if (i != kModuleNotFound)
  303.     {
  304.         FW_PrimitiveStringCopy(pzName, fModules[i].fModuleName);
  305.         return TRUE;
  306.     }
  307. #endif
  308.     return FALSE;
  309. }
  310.  
  311. //----------------------------------------------------------------------------------------
  312. // FW_CPrivWinDebugModuleList::FindModule
  313. //----------------------------------------------------------------------------------------
  314.  
  315.  
  316. unsigned short FW_CPrivWinDebugModuleList::FindModule(HANDLE fModule)
  317. {
  318. #ifdef FW_BUILD_WIN16
  319.     for (unsigned short i = 0; i < fNumberOfModules; i++)
  320.         if (fModules[i].fModule == fModule)
  321.             return i;
  322.  
  323.     return AddModule(fModule);
  324. #else
  325.     return 0;
  326. #endif
  327. }
  328.  
  329.  
  330. //----------------------------------------------------------------------------------------
  331. // FW_CPrivWinDebugModuleList::AddModule
  332. //----------------------------------------------------------------------------------------
  333.  
  334. unsigned short FW_CPrivWinDebugModuleList::AddModule(HANDLE fModule)
  335. {
  336. #ifdef FW_BUILD_WIN16
  337.     if (fNumberOfModules < kMaxModules)
  338.     {
  339.         // Get the module info from Windows
  340.         MODULEENTRY ModuleEntry;
  341.         ModuleEntry.dwSize = sizeof(MODULEENTRY);
  342.  
  343. #ifndef FW_BUILD_DOS
  344.         if (ModuleFindHandle(&ModuleEntry, fModule))
  345.         {
  346.             char zSymFileName[MAX_PATH + 1];
  347.  
  348.             FW_PrimitiveStringCopy(zSymFileName, ModuleEntry.szExePath);
  349.             FW_PrimitiveStringCopy(FW_PrimitiveStringFindCharacter(zSymFileName, '.'), ".SYM");
  350.  
  351.             fModules[fNumberOfModules].fSymFile = new FW_CPrivWinSymFile(zSymFileName);
  352.             fModules[fNumberOfModules].fModule = fModule;
  353.             FW_PrimitiveStringCopy(fModules[fNumberOfModules].fModuleName, ModuleEntry.szModule);
  354.  
  355.             return fNumberOfModules++;
  356.         }
  357. #endif
  358.     }
  359. #endif
  360.     return kModuleNotFound;
  361. }
  362.  
  363. #endif // FW_BUILD_WIN && FW_DEBUG
  364.  
  365.